"""
主入口模块

提供命令行界面进行AI聊天对话。
"""

import sys
import signal
from typing import Optional

import click
from colorama import init, Fore, Back, Style

from .chat import ChatAssistant
from .config import Config
from .models import ChatResponse

# 初始化colorama
init(autoreset=True)


class ChatCLI:
    """
    聊天命令行界面类
    """
    
    def __init__(self) -> None:
        """初始化CLI"""
        self.assistant: Optional[ChatAssistant] = None
        self.running = False
        
        # 设置信号处理
        signal.signal(signal.SIGINT, self._signal_handler)
    
    def _signal_handler(self, signum: int, frame) -> None:
        """
        处理中断信号（Ctrl+C）
        
        Args:
            signum: 信号编号
            frame: 当前栈帧
        """
        self._print_info("\n\n感谢使用AI聊天助手，再见！")
        sys.exit(0)
    
    def _print_info(self, message: str) -> None:
        """打印信息消息"""
        click.echo(f"{Fore.BLUE}ℹ️  {message}{Style.RESET_ALL}")
    
    def _print_success(self, message: str) -> None:
        """打印成功消息"""
        click.echo(f"{Fore.GREEN}✅ {message}{Style.RESET_ALL}")
    
    def _print_error(self, message: str) -> None:
        """打印错误消息"""
        click.echo(f"{Fore.RED}❌ {message}{Style.RESET_ALL}")
    
    def _print_warning(self, message: str) -> None:
        """打印警告消息"""
        click.echo(f"{Fore.YELLOW}⚠️  {message}{Style.RESET_ALL}")
    
    def _print_user(self, message: str) -> None:
        """打印用户消息"""
        click.echo(f"{Fore.CYAN}👤 您: {Style.RESET_ALL}{message}")
    
    def _print_assistant(self, message: str) -> None:
        """打印AI助手消息"""
        click.echo(f"{Fore.GREEN}🤖 AI: {Style.RESET_ALL}{message}")
    
    def _print_divider(self) -> None:
        """打印分隔线"""
        click.echo(f"{Fore.MAGENTA}{'─' * 60}{Style.RESET_ALL}")
    
    def _init_assistant(self) -> bool:
        """
        初始化AI助手
        
        Returns:
            bool: 是否初始化成功
        """
        try:
            config = Config.get_default()
            self.assistant = ChatAssistant(config)
            self.assistant.create_session()
            return True
        except Exception as e:
            self._print_error(f"初始化AI助手失败: {e}")
            return False
    
    def _show_welcome(self) -> None:
        """显示欢迎信息"""
        self._print_divider()
        click.echo(f"{Fore.YELLOW}{Style.BRIGHT}")
        click.echo("🎉 欢迎使用AI聊天助手！")
        click.echo("🚀 基于LangChain和Claude-3.7-Sonnet模型")
        click.echo(f"{Style.RESET_ALL}")
        
        if self.assistant:
            session_info = self.assistant.get_session_info()
            if session_info:
                self._print_info(f"会话ID: {session_info['session_id'][:8]}...")
                self._print_info(f"模型: {session_info['model']}")
        
        self._print_divider()
        self._print_info("输入您的问题开始对话")
        self._print_info("特殊命令:")
        click.echo(f"  {Fore.CYAN}/help{Style.RESET_ALL}     - 显示帮助信息")
        click.echo(f"  {Fore.CYAN}/clear{Style.RESET_ALL}    - 清空对话历史")
        click.echo(f"  {Fore.CYAN}/info{Style.RESET_ALL}     - 显示会话信息")
        click.echo(f"  {Fore.CYAN}/history{Style.RESET_ALL}  - 显示对话历史")
        click.echo(f"  {Fore.CYAN}/exit{Style.RESET_ALL}     - 退出程序")
        self._print_divider()
    
    def _show_help(self) -> None:
        """显示帮助信息"""
        self._print_info("AI聊天助手帮助信息:")
        click.echo(f"  {Fore.CYAN}/help{Style.RESET_ALL}     - 显示此帮助信息")
        click.echo(f"  {Fore.CYAN}/clear{Style.RESET_ALL}    - 清空当前会话的对话历史")
        click.echo(f"  {Fore.CYAN}/info{Style.RESET_ALL}     - 显示当前会话的详细信息")
        click.echo(f"  {Fore.CYAN}/history{Style.RESET_ALL}  - 显示最近10条对话历史")
        click.echo(f"  {Fore.CYAN}/exit{Style.RESET_ALL}     - 退出聊天程序")
        click.echo(f"\n💡 提示: 直接输入您的问题即可与AI进行对话")
    
    def _show_session_info(self) -> None:
        """显示会话信息"""
        if not self.assistant:
            self._print_error("AI助手未初始化")
            return
        
        session_info = self.assistant.get_session_info()
        if not session_info:
            self._print_warning("没有活动会话")
            return
        
        self._print_info("当前会话信息:")
        click.echo(f"  会话ID: {session_info['session_id']}")
        click.echo(f"  消息数量: {session_info['message_count']}")
        click.echo(f"  创建时间: {session_info['created_at']}")
        click.echo(f"  更新时间: {session_info['updated_at']}")
        click.echo(f"  使用模型: {session_info['model']}")
        click.echo(f"  API端点: {session_info['api_base']}")
    
    def _show_history(self) -> None:
        """显示对话历史"""
        if not self.assistant:
            self._print_error("AI助手未初始化")
            return
        
        history = self.assistant.get_message_history(limit=10)
        if not history:
            self._print_info("暂无对话历史")
            return
        
        self._print_info("最近10条对话历史:")
        self._print_divider()
        
        for msg in history:
            timestamp = msg.timestamp.strftime("%H:%M:%S") if msg.timestamp else "未知"
            if msg.role.value == "user":
                click.echo(f"{Fore.CYAN}[{timestamp}] 👤 您: {Style.RESET_ALL}{msg.content}")
            else:
                click.echo(f"{Fore.GREEN}[{timestamp}] 🤖 AI: {Style.RESET_ALL}{msg.content}")
        
        self._print_divider()
    
    def _clear_session(self) -> None:
        """清空会话"""
        if not self.assistant:
            self._print_error("AI助手未初始化")
            return
        
        if self.assistant.clear_session():
            self._print_success("对话历史已清空")
        else:
            self._print_error("清空对话历史失败")
    
    def _handle_command(self, user_input: str) -> bool:
        """
        处理特殊命令
        
        Args:
            user_input: 用户输入
            
        Returns:
            bool: 是否为特殊命令
        """
        command = user_input.strip().lower()
        
        if command == "/help":
            self._show_help()
            return True
        elif command == "/clear":
            self._clear_session()
            return True
        elif command == "/info":
            self._show_session_info()
            return True
        elif command == "/history":
            self._show_history()
            return True
        elif command in ["/exit", "/quit", "/q"]:
            self._print_info("感谢使用AI聊天助手，再见！")
            return False  # 这将导致退出主循环
        
        return False  # 不是特殊命令
    
    def _chat_with_user(self, user_input: str) -> None:
        """
        与用户进行聊天
        
        Args:
            user_input: 用户输入
        """
        if not self.assistant:
            self._print_error("AI助手未初始化")
            return
        
        # 显示用户输入
        self._print_user(user_input)
        
        # 显示"思考中"提示
        click.echo(f"{Fore.YELLOW}🤔 AI正在思考中...{Style.RESET_ALL}", nl=False)
        
        try:
            # 调用AI助手
            response: ChatResponse = self.assistant.chat(user_input)
            
            # 清除"思考中"提示
            click.echo(f"\r{' ' * 20}\r", nl=False)
            
            if response.success:
                self._print_assistant(response.content)
            else:
                self._print_error(f"AI响应失败: {response.error_message}")
        
        except KeyboardInterrupt:
            # 处理用户中断（Ctrl+C）
            click.echo(f"\r{' ' * 20}\r", nl=False)
            self._print_warning("操作已取消")
        except Exception as e:
            click.echo(f"\r{' ' * 20}\r", nl=False)
            self._print_error(f"发生错误: {e}")
    
    def run_interactive(self) -> None:
        """运行交互式聊天"""
        # 初始化助手
        if not self._init_assistant():
            return
        
        # 显示欢迎信息
        self._show_welcome()
        
        self.running = True
        
        try:
            while self.running:
                try:
                    # 获取用户输入
                    user_input = click.prompt(
                        f"{Fore.BLUE}💬{Style.RESET_ALL}", 
                        type=str,
                        show_default=False
                    ).strip()
                    
                    # 检查是否为空输入
                    if not user_input:
                        self._print_warning("请输入内容或使用 /help 查看帮助")
                        continue
                    
                    # 处理特殊命令
                    if user_input.startswith("/"):
                        command_result = self._handle_command(user_input)
                        if user_input.lower() in ["/exit", "/quit", "/q"]:
                            break
                        continue
                    
                    # 进行聊天
                    self._chat_with_user(user_input)
                    
                except KeyboardInterrupt:
                    # 处理Ctrl+C
                    self._print_info("\n\n感谢使用AI聊天助手，再见！")
                    break
                except EOFError:
                    # 处理Ctrl+D
                    self._print_info("\n\n感谢使用AI聊天助手，再见！")
                    break
                except Exception as e:
                    self._print_error(f"发生意外错误: {e}")
                    continue
        
        finally:
            self.running = False


@click.command()
@click.option(
    "--config-from-env", 
    is_flag=True, 
    help="从环境变量加载配置而不是使用默认配置"
)
def main(config_from_env: bool) -> None:
    """
    AI聊天助手命令行程序
    
    支持多轮对话，基于LangChain和Claude-3.7-Sonnet模型。
    """
    try:
        if config_from_env:
            # 从环境变量加载配置
            try:
                config = Config.from_env()
                click.echo(f"{Fore.GREEN}✅ 已从环境变量加载配置{Style.RESET_ALL}")
            except ValueError as e:
                click.echo(f"{Fore.RED}❌ 环境变量配置错误: {e}{Style.RESET_ALL}")
                click.echo(f"{Fore.YELLOW}💡 将使用默认配置{Style.RESET_ALL}")
                config = None
        else:
            config = None
        
        # 创建并运行CLI
        cli = ChatCLI()
        cli.run_interactive()
    
    except Exception as e:
        click.echo(f"{Fore.RED}❌ 程序启动失败: {e}{Style.RESET_ALL}")
        sys.exit(1)


if __name__ == "__main__":
    main()
